from openpyxl import Workbook
import calendar
import datetime

# 定义2024年部分法定节假日（示例，可根据实际详细情况补充完善）
legal_holidays_2024 = [
    datetime.date(2024, 1, 1),  # 元旦
    datetime.date(2024, 2, 10),  # 春节（示例日期，需按实际放假安排调整）
    datetime.date(2024, 2, 11),
    datetime.date(2024, 2, 12),
    datetime.date(2024, 2, 13),
    datetime.date(2024, 2, 14),
    datetime.date(2024, 2, 15),
    datetime.date(2024, 2, 16),
    datetime.date(2024, 2, 17),
    datetime.date(2024, 4, 4),  # 清明节
    datetime.date(2024, 4, 5),  # 清明节
    datetime.date(2024, 4, 6),  # 清明节
    datetime.date(2024, 5, 1),  # 劳动节
    datetime.date(2024, 5, 2),  # 劳动节
    datetime.date(2024, 5, 3),  # 劳动节
    datetime.date(2024, 5, 4),  # 劳动节
    datetime.date(2024, 5, 5),  # 劳动节
    datetime.date(2024, 6, 8),  # 端午节（示例日期，需按实际放假安排调整）
    datetime.date(2024, 6, 9),
    datetime.date(2024, 6, 10),
    datetime.date(2024, 9, 15),  # 中秋节
    datetime.date(2024, 9, 16),  # 中秋节
    datetime.date(2024, 9, 17),  # 中秋节
    datetime.date(2024, 10, 1),  # 国庆节
    datetime.date(2024, 10, 2),
    datetime.date(2024, 10, 3),
    datetime.date(2024, 10, 4),
    datetime.date(2024, 10, 5),
    datetime.date(2024, 10, 6),
    datetime.date(2024, 10, 7)
]

# 定义2024年部分法定调班日（示例，可根据实际详细情况补充完善）
working_days_on_holidays_2024 = [
    datetime.date(2024, 2, 4),  # 春节调班
    datetime.date(2024, 2, 18),
    datetime.date(2024, 4, 7),  # 清明节调班
    datetime.date(2024, 4, 28),  # 清明节调班
    datetime.date(2024, 5, 11),  # 劳动节调班
    datetime.date(2024, 9, 14),  # 中秋节调班
    datetime.date(2024, 9, 29),  # 中秋节调班
    datetime.date(2024, 10, 12),  # 国庆节调班
]


def create_attendance_sheet(year):
    # 遍历每个月份
    for month in range(1, 13):
        # 创建工作簿
        wb = Workbook()
        # 获取当前月份的工作表
        ws = wb.active
        ws.title = str(month) + "月考勤表"

        # 写入表头
        headers = ["序号", "日期", "签到时间", "签退时间", "备注"]
        for col_num, header in enumerate(headers, 1):
            ws.cell(row=1, column=col_num, value=header)

        # 获取当前月份的日历信息
        cal = calendar.monthcalendar(year, month)
        # 用于生成序号
        index = 1
        # 遍历每个星期
        for week in cal:
            for day in week:
                if day!= 0:
                    # 生成日期
                    date = datetime.date(year, month, day)
                    # 判断是否为工作日（周一到周五），不是法定节假日，或者是法定调班日
                    if (date.weekday() < 5 and date not in legal_holidays_2024) or date in working_days_on_holidays_2024:
                        # 写入数据
                        ws.cell(row=index + 1, column=1, value=index)
                        ws.cell(row=index + 1, column=2, value=date)
                        index += 1

        # 保存工作簿
        wb.save(f"{year}_{month}月考勤表.xlsx")


if __name__ == "__main__":
    create_attendance_sheet(2024)